/**
 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package de.hsmannheim.pepa.patientenportal.apanwep.service.persistence;

import com.liferay.portal.kernel.cache.CacheRegistryUtil;
import com.liferay.portal.kernel.dao.orm.EntityCacheUtil;
import com.liferay.portal.kernel.dao.orm.FinderCacheUtil;
import com.liferay.portal.kernel.dao.orm.FinderPath;
import com.liferay.portal.kernel.dao.orm.Query;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.InstanceFactory;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.UnmodifiableList;
import com.liferay.portal.model.CacheModel;
import com.liferay.portal.model.ModelListener;
import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;

import de.hsmannheim.pepa.patientenportal.apanwep.NoSuchcodesException;
import de.hsmannheim.pepa.patientenportal.apanwep.model.codes;
import de.hsmannheim.pepa.patientenportal.apanwep.model.impl.codesImpl;
import de.hsmannheim.pepa.patientenportal.apanwep.model.impl.codesModelImpl;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * The persistence implementation for the codes service.
 *
 * <p>
 * Caching information and settings can be found in <code>portal.properties</code>
 * </p>
 *
 * @author Cedric Nana
 * @see codesPersistence
 * @see codesUtil
 * @generated
 */
public class codesPersistenceImpl extends BasePersistenceImpl<codes>
	implements codesPersistence {
	/*
	 * NOTE FOR DEVELOPERS:
	 *
	 * Never modify or reference this class directly. Always use {@link codesUtil} to access the codes persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
	 */
	public static final String FINDER_CLASS_NAME_ENTITY = codesImpl.class.getName();
	public static final String FINDER_CLASS_NAME_LIST_WITH_PAGINATION = FINDER_CLASS_NAME_ENTITY +
		".List1";
	public static final String FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION = FINDER_CLASS_NAME_ENTITY +
		".List2";
	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_ALL = new FinderPath(codesModelImpl.ENTITY_CACHE_ENABLED,
			codesModelImpl.FINDER_CACHE_ENABLED, codesImpl.class,
			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findAll", new String[0]);
	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(codesModelImpl.ENTITY_CACHE_ENABLED,
			codesModelImpl.FINDER_CACHE_ENABLED, codesImpl.class,
			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findAll", new String[0]);
	public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(codesModelImpl.ENTITY_CACHE_ENABLED,
			codesModelImpl.FINDER_CACHE_ENABLED, Long.class,
			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countAll", new String[0]);

	public codesPersistenceImpl() {
		setModelClass(codes.class);
	}

	/**
	 * Caches the codes in the entity cache if it is enabled.
	 *
	 * @param codes the codes
	 */
	@Override
	public void cacheResult(codes codes) {
		EntityCacheUtil.putResult(codesModelImpl.ENTITY_CACHE_ENABLED,
			codesImpl.class, codes.getPrimaryKey(), codes);

		codes.resetOriginalValues();
	}

	/**
	 * Caches the codeses in the entity cache if it is enabled.
	 *
	 * @param codeses the codeses
	 */
	@Override
	public void cacheResult(List<codes> codeses) {
		for (codes codes : codeses) {
			if (EntityCacheUtil.getResult(codesModelImpl.ENTITY_CACHE_ENABLED,
						codesImpl.class, codes.getPrimaryKey()) == null) {
				cacheResult(codes);
			}
			else {
				codes.resetOriginalValues();
			}
		}
	}

	/**
	 * Clears the cache for all codeses.
	 *
	 * <p>
	 * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
	 * </p>
	 */
	@Override
	public void clearCache() {
		if (_HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE) {
			CacheRegistryUtil.clear(codesImpl.class.getName());
		}

		EntityCacheUtil.clearCache(codesImpl.class.getName());

		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_ENTITY);
		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
	}

	/**
	 * Clears the cache for the codes.
	 *
	 * <p>
	 * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
	 * </p>
	 */
	@Override
	public void clearCache(codes codes) {
		EntityCacheUtil.removeResult(codesModelImpl.ENTITY_CACHE_ENABLED,
			codesImpl.class, codes.getPrimaryKey());

		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
	}

	@Override
	public void clearCache(List<codes> codeses) {
		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);

		for (codes codes : codeses) {
			EntityCacheUtil.removeResult(codesModelImpl.ENTITY_CACHE_ENABLED,
				codesImpl.class, codes.getPrimaryKey());
		}
	}

	/**
	 * Creates a new codes with the primary key. Does not add the codes to the database.
	 *
	 * @param ID the primary key for the new codes
	 * @return the new codes
	 */
	@Override
	public codes create(long ID) {
		codes codes = new codesImpl();

		codes.setNew(true);
		codes.setPrimaryKey(ID);

		return codes;
	}

	/**
	 * Removes the codes with the primary key from the database. Also notifies the appropriate model listeners.
	 *
	 * @param ID the primary key of the codes
	 * @return the codes that was removed
	 * @throws de.hsmannheim.pepa.patientenportal.apanwep.NoSuchcodesException if a codes with the primary key could not be found
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public codes remove(long ID) throws NoSuchcodesException, SystemException {
		return remove((Serializable)ID);
	}

	/**
	 * Removes the codes with the primary key from the database. Also notifies the appropriate model listeners.
	 *
	 * @param primaryKey the primary key of the codes
	 * @return the codes that was removed
	 * @throws de.hsmannheim.pepa.patientenportal.apanwep.NoSuchcodesException if a codes with the primary key could not be found
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public codes remove(Serializable primaryKey)
		throws NoSuchcodesException, SystemException {
		Session session = null;

		try {
			session = openSession();

			codes codes = (codes)session.get(codesImpl.class, primaryKey);

			if (codes == null) {
				if (_log.isWarnEnabled()) {
					_log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
				}

				throw new NoSuchcodesException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
					primaryKey);
			}

			return remove(codes);
		}
		catch (NoSuchcodesException nsee) {
			throw nsee;
		}
		catch (Exception e) {
			throw processException(e);
		}
		finally {
			closeSession(session);
		}
	}

	@Override
	protected codes removeImpl(codes codes) throws SystemException {
		codes = toUnwrappedModel(codes);

		Session session = null;

		try {
			session = openSession();

			if (!session.contains(codes)) {
				codes = (codes)session.get(codesImpl.class,
						codes.getPrimaryKeyObj());
			}

			if (codes != null) {
				session.delete(codes);
			}
		}
		catch (Exception e) {
			throw processException(e);
		}
		finally {
			closeSession(session);
		}

		if (codes != null) {
			clearCache(codes);
		}

		return codes;
	}

	@Override
	public codes updateImpl(
		de.hsmannheim.pepa.patientenportal.apanwep.model.codes codes)
		throws SystemException {
		codes = toUnwrappedModel(codes);

		boolean isNew = codes.isNew();

		Session session = null;

		try {
			session = openSession();

			if (codes.isNew()) {
				session.save(codes);

				codes.setNew(false);
			}
			else {
				session.merge(codes);
			}
		}
		catch (Exception e) {
			throw processException(e);
		}
		finally {
			closeSession(session);
		}

		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);

		if (isNew) {
			FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
		}

		EntityCacheUtil.putResult(codesModelImpl.ENTITY_CACHE_ENABLED,
			codesImpl.class, codes.getPrimaryKey(), codes);

		return codes;
	}

	protected codes toUnwrappedModel(codes codes) {
		if (codes instanceof codesImpl) {
			return codes;
		}

		codesImpl codesImpl = new codesImpl();

		codesImpl.setNew(codes.isNew());
		codesImpl.setPrimaryKey(codes.getPrimaryKey());

		codesImpl.setID(codes.getID());
		codesImpl.setType(codes.getType());
		codesImpl.setCodesystemname(codes.getCodesystemname());

		return codesImpl;
	}

	/**
	 * Returns the codes with the primary key or throws a {@link com.liferay.portal.NoSuchModelException} if it could not be found.
	 *
	 * @param primaryKey the primary key of the codes
	 * @return the codes
	 * @throws de.hsmannheim.pepa.patientenportal.apanwep.NoSuchcodesException if a codes with the primary key could not be found
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public codes findByPrimaryKey(Serializable primaryKey)
		throws NoSuchcodesException, SystemException {
		codes codes = fetchByPrimaryKey(primaryKey);

		if (codes == null) {
			if (_log.isWarnEnabled()) {
				_log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
			}

			throw new NoSuchcodesException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
				primaryKey);
		}

		return codes;
	}

	/**
	 * Returns the codes with the primary key or throws a {@link de.hsmannheim.pepa.patientenportal.apanwep.NoSuchcodesException} if it could not be found.
	 *
	 * @param ID the primary key of the codes
	 * @return the codes
	 * @throws de.hsmannheim.pepa.patientenportal.apanwep.NoSuchcodesException if a codes with the primary key could not be found
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public codes findByPrimaryKey(long ID)
		throws NoSuchcodesException, SystemException {
		return findByPrimaryKey((Serializable)ID);
	}

	/**
	 * Returns the codes with the primary key or returns <code>null</code> if it could not be found.
	 *
	 * @param primaryKey the primary key of the codes
	 * @return the codes, or <code>null</code> if a codes with the primary key could not be found
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public codes fetchByPrimaryKey(Serializable primaryKey)
		throws SystemException {
		codes codes = (codes)EntityCacheUtil.getResult(codesModelImpl.ENTITY_CACHE_ENABLED,
				codesImpl.class, primaryKey);

		if (codes == _nullcodes) {
			return null;
		}

		if (codes == null) {
			Session session = null;

			try {
				session = openSession();

				codes = (codes)session.get(codesImpl.class, primaryKey);

				if (codes != null) {
					cacheResult(codes);
				}
				else {
					EntityCacheUtil.putResult(codesModelImpl.ENTITY_CACHE_ENABLED,
						codesImpl.class, primaryKey, _nullcodes);
				}
			}
			catch (Exception e) {
				EntityCacheUtil.removeResult(codesModelImpl.ENTITY_CACHE_ENABLED,
					codesImpl.class, primaryKey);

				throw processException(e);
			}
			finally {
				closeSession(session);
			}
		}

		return codes;
	}

	/**
	 * Returns the codes with the primary key or returns <code>null</code> if it could not be found.
	 *
	 * @param ID the primary key of the codes
	 * @return the codes, or <code>null</code> if a codes with the primary key could not be found
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public codes fetchByPrimaryKey(long ID) throws SystemException {
		return fetchByPrimaryKey((Serializable)ID);
	}

	/**
	 * Returns all the codeses.
	 *
	 * @return the codeses
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public List<codes> findAll() throws SystemException {
		return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
	}

	/**
	 * Returns a range of all the codeses.
	 *
	 * <p>
	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link de.hsmannheim.pepa.patientenportal.apanwep.model.impl.codesModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
	 * </p>
	 *
	 * @param start the lower bound of the range of codeses
	 * @param end the upper bound of the range of codeses (not inclusive)
	 * @return the range of codeses
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public List<codes> findAll(int start, int end) throws SystemException {
		return findAll(start, end, null);
	}

	/**
	 * Returns an ordered range of all the codeses.
	 *
	 * <p>
	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link de.hsmannheim.pepa.patientenportal.apanwep.model.impl.codesModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
	 * </p>
	 *
	 * @param start the lower bound of the range of codeses
	 * @param end the upper bound of the range of codeses (not inclusive)
	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
	 * @return the ordered range of codeses
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public List<codes> findAll(int start, int end,
		OrderByComparator orderByComparator) throws SystemException {
		boolean pagination = true;
		FinderPath finderPath = null;
		Object[] finderArgs = null;

		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
				(orderByComparator == null)) {
			pagination = false;
			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL;
			finderArgs = FINDER_ARGS_EMPTY;
		}
		else {
			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_ALL;
			finderArgs = new Object[] { start, end, orderByComparator };
		}

		List<codes> list = (List<codes>)FinderCacheUtil.getResult(finderPath,
				finderArgs, this);

		if (list == null) {
			StringBundler query = null;
			String sql = null;

			if (orderByComparator != null) {
				query = new StringBundler(2 +
						(orderByComparator.getOrderByFields().length * 3));

				query.append(_SQL_SELECT_CODES);

				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
					orderByComparator);

				sql = query.toString();
			}
			else {
				sql = _SQL_SELECT_CODES;

				if (pagination) {
					sql = sql.concat(codesModelImpl.ORDER_BY_JPQL);
				}
			}

			Session session = null;

			try {
				session = openSession();

				Query q = session.createQuery(sql);

				if (!pagination) {
					list = (List<codes>)QueryUtil.list(q, getDialect(), start,
							end, false);

					Collections.sort(list);

					list = new UnmodifiableList<codes>(list);
				}
				else {
					list = (List<codes>)QueryUtil.list(q, getDialect(), start,
							end);
				}

				cacheResult(list);

				FinderCacheUtil.putResult(finderPath, finderArgs, list);
			}
			catch (Exception e) {
				FinderCacheUtil.removeResult(finderPath, finderArgs);

				throw processException(e);
			}
			finally {
				closeSession(session);
			}
		}

		return list;
	}

	/**
	 * Removes all the codeses from the database.
	 *
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public void removeAll() throws SystemException {
		for (codes codes : findAll()) {
			remove(codes);
		}
	}

	/**
	 * Returns the number of codeses.
	 *
	 * @return the number of codeses
	 * @throws SystemException if a system exception occurred
	 */
	@Override
	public int countAll() throws SystemException {
		Long count = (Long)FinderCacheUtil.getResult(FINDER_PATH_COUNT_ALL,
				FINDER_ARGS_EMPTY, this);

		if (count == null) {
			Session session = null;

			try {
				session = openSession();

				Query q = session.createQuery(_SQL_COUNT_CODES);

				count = (Long)q.uniqueResult();

				FinderCacheUtil.putResult(FINDER_PATH_COUNT_ALL,
					FINDER_ARGS_EMPTY, count);
			}
			catch (Exception e) {
				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_ALL,
					FINDER_ARGS_EMPTY);

				throw processException(e);
			}
			finally {
				closeSession(session);
			}
		}

		return count.intValue();
	}

	/**
	 * Initializes the codes persistence.
	 */
	public void afterPropertiesSet() {
		String[] listenerClassNames = StringUtil.split(GetterUtil.getString(
					com.liferay.util.service.ServiceProps.get(
						"value.object.listener.de.hsmannheim.pepa.patientenportal.apanwep.model.codes")));

		if (listenerClassNames.length > 0) {
			try {
				List<ModelListener<codes>> listenersList = new ArrayList<ModelListener<codes>>();

				for (String listenerClassName : listenerClassNames) {
					listenersList.add((ModelListener<codes>)InstanceFactory.newInstance(
							getClassLoader(), listenerClassName));
				}

				listeners = listenersList.toArray(new ModelListener[listenersList.size()]);
			}
			catch (Exception e) {
				_log.error(e);
			}
		}
	}

	public void destroy() {
		EntityCacheUtil.removeCache(codesImpl.class.getName());
		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_ENTITY);
		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
	}

	private static final String _SQL_SELECT_CODES = "SELECT codes FROM codes codes";
	private static final String _SQL_COUNT_CODES = "SELECT COUNT(codes) FROM codes codes";
	private static final String _ORDER_BY_ENTITY_ALIAS = "codes.";
	private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No codes exists with the primary key ";
	private static final boolean _HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE = GetterUtil.getBoolean(PropsUtil.get(
				PropsKeys.HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE));
	private static Log _log = LogFactoryUtil.getLog(codesPersistenceImpl.class);
	private static codes _nullcodes = new codesImpl() {
			@Override
			public Object clone() {
				return this;
			}

			@Override
			public CacheModel<codes> toCacheModel() {
				return _nullcodesCacheModel;
			}
		};

	private static CacheModel<codes> _nullcodesCacheModel = new CacheModel<codes>() {
			@Override
			public codes toEntityModel() {
				return _nullcodes;
			}
		};
}